﻿// Inner Fire 游戏引擎库
// 渲染项目类-基类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 所有的RenderItem类都需要继承此类
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-21

#pragma once

#include <dx/core/dx_core.h>
#include <static_string.h>

namespace ifire::dx {

enum class RenderLayer : int {
  Opaque = 0,
  SkinnedOpaque,
  AlphaTransparent,
  Transparent,
  SkinnedTransparent,
  SkinnedAlpha,
  AlphaTest,
  SkinnedAlphaTest,
  SkyBox,
  Tree,
  GpuWaves,
  UI,
  Debug,
  Particle,
  Count
};

enum class RenderItemType {
  Normal,  // 常规渲染类型
  SkinMesh // 蒙皮骨骼
};

class BasicRenderItem {
public:
  BasicRenderItem();
  BasicRenderItem(const BasicRenderItem& lhs) = delete;
  BasicRenderItem& operator=(const BasicRenderItem& lhs) = delete;
  ~BasicRenderItem() = default;

  // 脏标志表示对象数据已更改
  void SetRefresh() { frame_dirty_count = FRAME_RESOURCE_COUNT; }
  // 将名称转化为枚举类型
  static RenderLayer GetRenderLayer(ikit::sstr name);

public:
  // 此项目的类型
  RenderItemType type = RenderItemType::Normal;
  // 项目的全局ID
  std::uint64_t instanced_id;
  // 项目的名称（不是必须）
  ikit::sstr instanced_name;
  // 项目的索引
  int index;
  // 项目的类型
  RenderLayer render_layer;
  // 项目是否可见
  bool visible = true;
  // 拓扑类型
  D3D12_PRIMITIVE_TOPOLOGY primitive_type = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
  // 脏标志
  int frame_dirty_count = FRAME_RESOURCE_COUNT;
};

} // namespace ifire::dx